﻿using ExpressionBuilder.Helpers;
using ExpressionBuilder.Interfaces;
using System.Collections.Generic;

namespace ExpressionBuilder.Operations
{
    /// <summary>
    ///显示支持的默认操作 
    ///<seealso cref="Builders.FilterBuilder" />.
    /// </summary>
    public static class Operation
    {
        private static OperationHelper _operationHelper;

        static Operation()
        {
            _operationHelper = new OperationHelper();
        }

        /// <summary>
        ///表示范围比较的操作。
        /// </summary>
        public static IOperation Between { get { return new Between(); } }

        /// <summary>
        ///表示字符串"Contains"方法调用的操作。
        /// </summary>
        public static IOperation Contains { get { return new Contains(); } }

        /// <summary>
        /// 检查另一个字符串中是否存在子字符串的操作。
        /// </summary>
        public static IOperation DoesNotContain { get { return new DoesNotContain(); } }

        /// <summary>
        /// 表示字符串"Ends With"方法调用的操作。
        /// </summary>
        public static IOperation EndsWith { get { return new EndsWith(); } }

        /// <summary>
        /// 表示相等比较的操作。
        /// </summary>
        public static IOperation EqualTo { get { return new EqualTo(); } }

        /// <summary>
        ///表示"大于"比较的操作。
        /// </summary>
        public static IOperation GreaterThan { get { return new GreaterThan(); } }

        /// <summary>
        /// 表示"大于或等于"比较的操作。
        /// </summary>
        public static IOperation GreaterThanOrEqualTo { get { return new GreaterThanOrEqualTo(); } }

        /// <summary>
        ///表示列表"Contains"方法调用的操作。
        /// </summary>
        public static IOperation In { get { return new In(); } }

        /// <summary>
        /// 表示检查空字符串的操作。
        /// </summary>
        public static IOperation IsEmpty { get { return new IsEmpty(); } }

        /// <summary>
        /// 表示检查非空字符串的操作。
        /// </summary>
        public static IOperation IsNotEmpty { get { return new IsNotEmpty(); } }

        /// <summary>
        /// 表示"非空"检查的操作。
        /// </summary>
        public static IOperation IsNotNull { get { return new IsNotNull(); } }

        /// <summary>
        /// 表示"非空或空白"检查的操作。
        /// </summary>
        public static IOperation IsNotNullNorWhiteSpace { get { return new IsNotNullNorWhiteSpace(); } }

        /// <summary>
        ///表示空检查的操作。
        /// </summary>
        public static IOperation IsNull { get { return new IsNull(); } }

        /// <summary>
        /// 表示"空或空白"检查的操作。
        /// </summary>
        public static IOperation IsNullOrWhiteSpace { get { return new IsNullOrWhiteSpace(); } }

        /// <summary>
        /// 表示"小于"比较的操作。
        /// </summary>
        public static IOperation LessThan { get { return new LessThan(); } }

        /// <summary>
        /// 表示"小于或等于"比较的操作。
        /// </summary>
        public static IOperation LessThanOrEqualTo { get { return new LessThanOrEqualTo(); } }

        /// <summary>
        ///表示不等式比较的操作。
        /// </summary>
        public static IOperation NotEqualTo { get { return new NotEqualTo(); } }

        /// <summary>
        /// 表示字符串"Starts With"方法调用的操作。
        /// </summary>
        public static IOperation StartsWith { get { return new StartsWith(); } }

        /// <summary>
        /// 表示列表"Contains"方法调用的逆操作。
        /// </summary>
        public static IOperation NotIn { get { return new NotIn(); } }

        /// <summary>
        ///实例化给定名称的IOperation。
        /// </summary>
        /// <param name="operationName">Name of the operation to be instantiated.</param>
        /// <returns></returns>
        public static IOperation ByName(string operationName)
        {
            return _operationHelper.GetOperationByName(operationName);
        }

        /// <summary>
        ///将自定义操作列表加载到
        /// <see cref="Operations"></see> list.
        /// </summary>
        /// <param name="operations">要加载的操作列表.</param>
        /// <param name="overloadExisting">指定应使用列表中的操作替换任何匹配的预先存在的操作。（用于覆盖默认操作）</param>
        public static void LoadOperations(List<IOperation> operations, bool overloadExisting = false)
        {
            _operationHelper.LoadOperations(operations, overloadExisting);
        }
    }
}